#ifndef FAT32_FUNCTIONS_H_
#define FAT32_FUNCTIONS_H_
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <stdint.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include "Bitvector.h"
#include "utils.h"
#include "direccionamiento_FAT.h"
#include "cache.h"
#define _GNU_SOURCE

#define VACIA 0
#define LFN 1
#define BORRADA 2
#define NORMAL 3
#define PUNTO 4
#define ARCHIVO 5
#define DIRECTORIO 6

typedef struct {
	int tamanioSector;
	int sectoresPorCluster;
	int sectoresReservados;
	int sectoresPorFAT;
	int numClusterDirRoot;
	//int numClustersLibres;
	int cantidadSectores;
}__attribute__((packed)) fat32_data;

int numClustersLibres;
int mutexFAT;
typedef struct ArchDir{
char nombre[17];
int tipo;
uint32_t tamanio;
uint32_t numClusterInicial;
int LongFN;
int numSectorEntrada;
int offsetEntrada;
struct ArchDir* sig;
}__attribute__((packed)) fat32_directory;

typedef struct c{
int numCluster;
struct c* sig;
}__attribute__((packed))listaClusters;

fat32_data FAT32;

int leer_Boot_Sector();
int buscar_Clusters_libres(int,int*);
int grabar_FAT(int,int);
int bajar_datos_Cluster_FAT();

int abrirArchivoDisco();
void leerArchivoDisco(int sector,char* buffLectura);
void escribirArchivoDisco(int sector,char* buffEscritura);

int agregarCluster(int*,listaClusters*);
int leerDirectorio(fat32_directory *,int);
int conseguirCadenaClusters(listaClusters*,int);
int conseguirCadenaClustersA(listaClusters*,int);
int calcularPrimerSectorDelCluster(int);
int leerSectoresDelCluster(int,fat32_directory *);
float calcularSectorPosicionCluster(int,int*);
int parsearCluster(char*);
int parsearEntradaDirectorio(char*,fat32_directory *);
int cargarEntradaDirectorio(char*,fat32_directory*,char*);
uint32_t convertirLittleEndianABigEndianEnVector(char*,int);
int buscarEntradaLibre(int,int*,int*,int);
#endif
